home *** CD-ROM | disk | FTP | other *** search
- /* @(#)cg2reg.h 1.11 88/02/08 SMI */
-
- /*
- * Copyright 1983, 1987 by Sun Microsystems, Inc.
- */
-
- #ifndef cg2reg_DEFINED
- #define cg2reg_DEFINED
-
- /*
- * cg2 -- color frame buffers with rasterop chips
- *
- * The frame buffer address space looks like this:
- *
- * 0x000000 plane mode memory
- * 0x100000 pixel mode memory
- * 0x200000 rop mode memory
- * 0x300000 control registers
- * 0x310000 color map
- *
- * To save on virtual address space, we don't map the plane or pixel mode
- * memory (first two megabytes). However, when calling mmap the user has
- * to add 2M to the desired offset anyway (goofy, huh?).
- *
- * The board can also be jumpered so the plane and pixel mode memory are
- * not accessible at all, and the rop mode memory and control registers
- * are decoded starting at address offset 0.
- */
-
- /* offset to and size of mapped part of frame buffer */
- #define CG2_MAPPED_OFFSET (sizeof (struct cg2memfb))
- #define CG2_MAPPED_SIZE (sizeof (struct cg2fb))
-
- /* interrupt priority */
- #define CG2_INT_PRI 4
-
- /* frame buffer resolution constants */
- #define CG2_WIDTH 1152
- #define CG2_HEIGHT 900
- #define CG2_SQUARE 1024
- #define CG2_DEPTH 8
-
- /*
- * Structure describing plane and pixel mode memory -- pretty useless
- * since we don't map that part of the frame buffer.
- */
- struct cg2memfb {
- union bitplane { /* word mode memory */
- short word[CG2_HEIGHT][CG2_WIDTH/(8*sizeof(short))];
- short sword[CG2_SQUARE][CG2_SQUARE/(8*sizeof(short))];
- } memplane[8];
- union byteplane { /* pixel mode memory */
- u_char pixel[CG2_HEIGHT][CG2_WIDTH];
- u_char spixel[CG2_SQUARE][CG2_SQUARE];
- } pixplane;
- };
-
- /* control/status register */
- struct cg2statusreg {
- u_int unused : 2; /* reserved for future use */
- u_int fastread : 1; /* has fast read feature */
- u_int id : 1; /* has ID, extended status registers */
- u_int resolution : 4; /* screen resolution */
- #define CG2_SCR_1152X900 0
- #define CG2_SCR_1024X1024 1
- #define CG2_SCR_1600X1280 2
- #define CG2_SCR_1440X1440 3
- unsigned retrace : 1; /* rdonly: monitor in retrace */
- unsigned inpend : 1; /* rdonly: interrupt pending */
- unsigned ropmode : 3; /* Rasterop mode */
- unsigned inten : 1; /* enab interrupt at end of retrace */
- unsigned update_cmap : 1;
- /* copy TTL cmap to ECL cmap next vert retrace*/
- /* silently disables writing to TTL cmap */
- unsigned video_enab : 1; /* enab video DACs */
- };
-
- /* extended status register */
- struct cg2_status2 {
- u_int gpintreq : 1; /* GP interrupt request */
- u_int gpintdis : 1; /* GP interrupt disable */
- u_int unused : 13; /* reserved for future use */
- u_int gpbus : 1; /* GP bus enabled (read only) */
- };
-
- /* double buffering control register */
- struct dblbufreg {
- u_int display_b : 1; /* Display memory set B or A. */
- /* Synchronized to start of vertical retrace. */
- u_int read_b : 1; /* Read memory set B or A. */
- u_int nowrite_b : 1; /* Do not update memory set B on writes. */
- u_int nowrite_a : 1; /* Do not update memory set A on writes. */
- u_int read_ecmap : 1;/* ECL to TTL cmap transfer direction. */
- /* Synchronized to start of Vertical retrace. */
- u_int fast_read : 1; /* Return invalid data but fast Dtack on read */
- u_int wait : 1; /* Write a '1' to set. Bit will remain */
- /* high until a full vertical retrace period has */
- /* elapsed. The bit clears itself. */
- u_int update_ecmap : 1;
- u_int reserved : 8;
- };
-
- /* zoom/pan registers; Sun-2 color board only */
- struct cg2_zoom {
- union { /*----- word pan register */
- unsigned short reg; /* hi 16 of 20 bit pix addr */
- /* pix addr = CG2_WIDTH*y+x */
- char pad[4096];
- } wordpan;
- union { /*----- zoom and line offset register */
- struct {
- unsigned unused : 8;
- unsigned lineoff : 4; /* y offset into zoomed pixel */
- unsigned pixzoom : 4; /* zoomed pixel size - 1 */
- } reg;
- short word;
- char pad[4096];
- } zoom;
- union { /*----- pixel pan register */
- struct {
- unsigned unused : 8;
- unsigned lorigin : 4; /* lo 4 bits of pix addr */
- unsigned pixeloff : 4; /* zoomed pixel x offset/4 */
- } reg;
- short word;
- char pad[4096];
- } pixpan;
- union { /*----- variable zoom register */
- /* reset zoom after line no */
- unsigned short reg; /* line number 0..1024/4 */
- char pad[4096];
- } varzoom;
- };
-
- /* misc. control registers; Sun-3 color board etc. */
- struct cg2_nozoom {
- union { /*----- double buffering register */
- struct dblbufreg reg;
- short word;
- char pad[4096];
- } dblbuf;
- union { /*----- dma window origin register */
- unsigned short reg;
- char pad [4096];
- } dmabase;
- union { /*----- dma window width register */
- unsigned short reg; /* reg * 16 specifies width */
- char pad [4096]; /* of dma window. 8 bit. */
- } dmawidth;
- union { /*----- frame count register */
- unsigned short reg; /* 8 bit. Read-only. */
- /* Returns frame number mod 256. */
- char pad[4096];
- } framecnt;
- };
-
- /* structure describing mapped part of frame buffer */
- struct cg2fb {
- union { /* ROP mode memory */
- union bitplane ropplane[8]; /* word mode memory with ROP */
- union byteplane roppixel; /* pixel mode memory with ROP */
- } ropio;
- union { /* rasterop unit control */
- struct memropc ropregs; /* normal register access */
- struct {
- char pad[2048]; /* for pixmode src reg prime */
- struct memropc ropregs; /* byte xfer loads alternate */
- } prime; /* src register bits */
- char pad[4096];
- } ropcontrol[9];
- union { /*----- status register */
- struct cg2statusreg reg;
- short word;
- char pad[4096];
- } status;
- union { /*----- per plane mask register */
- unsigned short reg; /* 8 bits 1bit -> wr to plane*/
- char pad[4096];
- } ppmask;
- union {
- struct cg2_zoom zoom;
- struct cg2_nozoom nozoom;
- } misc;
- union { /*----- interrupt vector register */
- unsigned short reg; /* line number 0..1024/4 */
- char pad[32];
- } intrptvec;
- union { /* board ID */
- u_short reg;
- char pad[16];
- } id;
- union { /* extended status */
- struct cg2_status2 reg;
- u_short word;
- char pad[16];
- } status2;
- union { /* auxiliary ropmode register */
- u_short reg;
- char pad[4032];
- } ropmode;
- u_short redmap[256]; /* shadow color maps */
- u_short greenmap[256];
- u_short bluemap[256];
- };
-
- /*
- * ROPMODE PARALLEL LD_DST LD_SRC Description
- * ON ON */
- #define PRWWRD 0 /* parallel 8 plane, read write, wrdmode */
- #define SRWPIX 1 /* single pixel, read write, pixmode */
- #define PWWWRD 2 /* parallel 8 plane, write write, wrdmode */
- #define SWWPIX 3 /* single pixel, write write, pixmode */
- #define PRRWRD 4 /* parallel 8 plane, read read, wrdmode */
- #define PRWPIX 5 /* parallel16 pixel, read write, pixmode */
- #define PWRWRD 6 /* parallel 8 plane, write read, wrdmode */
- #define PWWPIX 7 /* parallel16 pixel, write write, pixmode */
-
- /*
- * ROP control unit numbers
- */
- #define CG2_ROP0 0 /* rasterop unit for bit plane 0 */
- #define CG2_ROP1 1 /* rasterop unit for bit plane 1 */
- #define CG2_ROP2 2
- #define CG2_ROP3 3
- #define CG2_ROP4 4
- #define CG2_ROP5 5
- #define CG2_ROP6 6
- #define CG2_ROP7 7
- #define CG2_ALLROP 8 /* writes to all units enabled by PPMASK */
- /* reads from plane zero */
-
- #define CG_SRC 0xCC
- #define CG_DEST 0xAA
- #define CG_MASK 0xf0
- #define CG_NOTMASK 0x0f
- #define CGOP_NEEDS_MASK(op) ( (((op)>>4)^(op)) & CG_NOTMASK)
-
- /*
- *----------- Defines for accessing the rasterop units
- */
- #define cg2_setrsource(fb, ropunit, val) \
- ((fb)->ropcontrol[(ropunit)].ropregs.mrc_source1 = (val))
- #define cg2_setrsource_pix(fb, ropunit, val) \
- ((fb)->ropcontrol[(ropunit)].prime.ropregs.mrc_source1 = (val))
- #define cg2_setlsource(fb, ropunit, val) \
- ((fb)->ropcontrol[(ropunit)].ropregs.mrc_source2 = (val))
- #define cg2_setlsource_pix(fb, ropunit, val) \
- ((fb)->ropcontrol[(ropunit)].prime.ropregs.mrc_source2 = (val))
- #define cg2_setpattern(fb, ropunit, val) \
- ((fb)->ropcontrol[(ropunit)].ropregs.mrc_pattern = (val))
- #define cg2_setlmask(fb, ropunit, val) \
- ((fb)->ropcontrol[(ropunit)].ropregs.mrc_mask1 = (val))
- #define cg2_setrmask(fb, ropunit, val) \
- ((fb)->ropcontrol[(ropunit)].ropregs.mrc_mask2 = (val))
- #define cg2_setshift(fb, ropunit, shft, dir) \
- ((fb)->ropcontrol[(ropunit)].ropregs.mrc_shift = \
- (shft)|((dir)<<8) )
- #define cg2_setfunction(fb, ropunit, val) \
- ((fb)->ropcontrol[(ropunit)].ropregs.mrc_op = (val))
- #define cg2_setwidth(fb, ropunit, w, count) \
- ((fb)->ropcontrol[(ropunit)].ropregs.mrc_width = (w)); \
- ((fb)->ropcontrol[(ropunit)].ropregs.mrc_opcount = (count))
-
- /*
- *----------- Defines for accessing the zoom and pan registers
- */
- #define cg2_setzoom(fb, pixsize) \
- ((fb)->misc.zoom.zoom.reg.pixzoom = (pixsize)-1)
- #define cg2_setpanoffset(fb, xoff, yoff) \
- ((fb)->misc.zoom.pixpan.reg.pixeloff = (xoff)>>2; \
- (fb)->misc.zoom.zoom.reg.lineoff = (yoff))
- #define cg2_setpanorigin(fb, x, y) \
- ((y) = ((fb)->misc.zoom.status.reg.resolution == 1) ? \
- (y)*CG2_SQUARE+(x) : (y)*CG2_WIDTH+(x); \
- (fb)->misc.zoom.pixpan.reg.lorigin = (y)&0xf; \
- (fb)->misc.zoom.wordpan.reg = (y)>>4)
- #define cg2_setzoomstop(fb, y) \
- ((fb)->misc.zoom.varzoom.reg = (y)>>2)
-
- /*
- * Defines that facilitate addressing the frame buffer
- */
-
- #define cg2_pixaddr(fb, x, y) \
- (((fb)->status.reg.resolution) ? \
- &(fb)->pixplane.spixel[(y)][(x)] : \
- &(fb)->pixplane.pixel[(y)][(x)] )
- #define cg2_wordaddr(fb, plane, x, y) \
- (((fb)->status.reg.resolution) ? \
- &(fb)->memplane[(plane)].sword[(y)][(x)>>4] : \
- &(fb)->memplane[(plane)].word[(y)][(x)>>4])
- #define cg2_roppixaddr(fb, x, y) \
- (((fb)->status.reg.resolution) ? \
- &(fb)->ropio.roppixel.spixel[(y)][(x)] : \
- &(fb)->ropio.roppixel.pixel[(y)][(x)])
- #define cg2_ropwordaddr(fb, plane, x, y) \
- (((fb)->status.reg.resolution) ? \
- &(fb)->ropio.ropplane[(plane)].sword[(y)][(x)>>4]:\
- &(fb)->ropio.ropplane[(plane)].word[(y)][(x)>>4])
- #define cg2_width(fb ) \
- ( ((fb)->status.reg.resolution) ? CG2_SQUARE : CG2_WIDTH )
- #define cg2_height(fb ) \
- ( ((fb)->status.reg.resolution) ? CG2_SQUARE : CG2_HEIGHT )
- #define cg2_linebytes(fb, mode) \
- ( ((fb)->status.reg.resolution) \
- ? ( ((mode)&1)?CG2_SQUARE:CG2_SQUARE/8 ) \
- : ( ((mode)&1)?CG2_WIDTH:CG2_WIDTH/8 ))
-
- #define cg2_prskew(x) ((x) & 15)
-
- #define cg2_touch(a) ((a)=0)
-
- #endif cg2reg_DEFINED
-